package ui;

import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.Scanner;
import java.text.SimpleDateFormat;

import entity.LabAvailableTime;
import entity.User;
import entity.Lab;
import dao.UserDAO;
import dao.LabDAO;
import dao.LabReservationDAO;

public class AdminUI {
    private final Scanner scanner = new Scanner(System.in);
    private final UserDAO userDAO = new UserDAO();
    private final LabDAO labDAO = new LabDAO();
    private final LabReservationDAO reservationDAO = new LabReservationDAO();
    private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");

    public void showMenu() {
        while (true) {
            System.out.println("\n=== 管理员菜单 ===");
            System.out.println("1. 用户管理");
            System.out.println("2. 实验室管理");
            System.out.println("3. 查看实验室使用情况");
            System.out.println("4. 退出");
            System.out.print("请选择操作：");

            int choice = scanner.nextInt();
            scanner.nextLine();

            switch (choice) {
                case 1: userManagement(); break;
                case 2: labManagement(); break;
                case 3: showLabUsage(); break;
                case 4: return;
                default: System.out.println("无效选择");
            }
        }
    }

    // 用户管理子菜单
    private void userManagement() {
        while (true) {
            System.out.println("\n=== 用户管理 ===");
            System.out.println("1. 添加用户");
            System.out.println("2. 删除用户");
            System.out.println("3. 查看用户列表");
            System.out.println("4. 返回主菜单");
            System.out.print("请选择操作：");

            int choice = scanner.nextInt();
            scanner.nextLine();

            switch (choice) {
                case 1:
                    addUser();
                    break;
                case 2:
                    deleteUser();
                    break;
                case 3:
                    listUsers();
                    break;
                case 4:
                    return;
                default:
                    System.out.println("无效选择");
            }
        }
    }

    // 添加用户
    private void addUser() {
        System.out.print("请输入用户ID：");
        int userId = scanner.nextInt();
        scanner.nextLine();

        System.out.print("请输入用户名：");
        String username = scanner.nextLine();
        System.out.print("请输入密码：");
        String password = scanner.nextLine();
        System.out.print("请输入真实姓名：");
        String realName = scanner.nextLine();
        System.out.print("请输入角色（admin/teacher/student）：");
        String role = scanner.nextLine();

        User user = new User();
        user.setUserId(userId);
        user.setUsername(username);
        user.setPassword(password);
        user.setRealName(realName);
        user.setRole(role);

        if (userDAO.addUser(user)) {
            System.out.println("用户添加成功");
        } else {
            System.out.println("用户添加失败");
        }
    }

    // 删除用户
    private void deleteUser() {
        System.out.print("请输入要删除的用户ID：");
        int userId = scanner.nextInt();
        scanner.nextLine();

        if (userDAO.deleteUser(userId)) {
            System.out.println("用户删除成功");
        } else {
            System.out.println("用户删除失败（ID不存在）");
        }
    }

    // 查看用户列表
    private void listUsers() {
        System.out.println("\n=== 用户列表 ===");
        userDAO.listAllUsers().forEach(user ->
                System.out.printf("ID: %d, 用户名: %s, 姓名: %s, 角色: %s\n",
                        user.getUserId(), user.getUsername(), user.getRealName(), user.getRole())
        );
    }

    // 实验室管理子菜单
    private void labManagement() {
        while (true) {
            System.out.println("\n=== 实验室管理 ===");
            System.out.println("1. 添加实验室");
            System.out.println("2. 删除实验室");
            System.out.println("3. 修改实验室信息");
            System.out.println("4. 查看实验室列表");
            System.out.println("5. 管理可用时间段"); // 新增选项
            System.out.println("6. 返回主菜单");
            System.out.print("请选择操作：");

            int choice = scanner.nextInt();
            scanner.nextLine();

            switch (choice) {
                case 1:
                    addLab();
                    break;
                case 2:
                    deleteLab();
                    break;
                case 3:
                    updateLab();
                    break;
                case 4:
                    listLabs();
                    break;
                case 5:
                    manageLabAvailableTimes(); // 新增方法
                    break;
                case 6:
                    return;
                default:
                    System.out.println("无效选择");
            }
        }
    }

    private void manageLabAvailableTimes() {
        System.out.print("请输入实验室ID：");
        int labId = scanner.nextInt();
        scanner.nextLine();

        Lab lab = labDAO.getLabById(labId);
        if (lab == null) {
            System.out.println("实验室不存在");
            return;
        }

        while (true) {
            System.out.println("\n=== 管理 " + lab.getLabName() + " 可用时间段 ===");
            System.out.println("1. 添加可用时间段");
            System.out.println("2. 删除可用时间段");
            System.out.println("3. 查看可用时间段");
            System.out.println("4. 返回上级菜单");
            System.out.print("请选择操作：");

            int choice = scanner.nextInt();
            scanner.nextLine();

            switch (choice) {
                case 1:
                    addAvailableTime(labId);
                    break;
                case 2:
                    deleteAvailableTime(labId);
                    break;
                case 3:
                    viewAvailableTimes(labId);
                    break;
                case 4:
                    return;
                default:
                    System.out.println("无效选择");
            }
        }
    }

    private void addAvailableTime(int labId) {
        System.out.print("请输入开始时间（格式yyyy-MM-dd HH:mm）：");
        String startStr = scanner.nextLine();
        System.out.print("请输入结束时间（格式yyyy-MM-dd HH:mm）：");
        String endStr = scanner.nextLine();

        try {
            Date startTime = sdf.parse(startStr);
            Date endTime = sdf.parse(endStr);

            LabAvailableTime time = new LabAvailableTime();
            time.setLabId(labId);
            time.setStartTime(startTime);
            time.setEndTime(endTime);

            if (labDAO.addAvailableTime(time)) {
                System.out.println("可用时间段添加成功");
            } else {
                System.out.println("可用时间段添加失败（可能已存在）");
            }
        } catch (ParseException e) {
            System.out.println("时间格式错误");
        }
    }

    private void deleteAvailableTime(int labId) {
        System.out.print("请输入要删除的时间段ID：");
        int timeId = scanner.nextInt();
        scanner.nextLine();

        if (labDAO.deleteAvailableTime(timeId)) {
            System.out.println("可用时间段删除成功");
        } else {
            System.out.println("可用时间段删除失败（ID不存在）");
        }
    }

    private void viewAvailableTimes(int labId) {
        List<LabAvailableTime> times = labDAO.getAvailableTimesByLabId(labId);
        System.out.println("\n=== 可用时间段列表 ===");
        times.forEach(time ->
                System.out.printf("ID: %d, 时间: %s - %s\n",
                        time.getTimeId(),
                        sdf.format(time.getStartTime()),
                        sdf.format(time.getEndTime())
                )
        );
    }

    // 添加实验室
    private void addLab() {
        System.out.print("请输入实验室ID：");
        int labId = scanner.nextInt();
        scanner.nextLine();

        System.out.print("请输入实验室编号：");
        String labNumber = scanner.nextLine();
        System.out.print("请输入实验室名称：");
        String labName = scanner.nextLine();
        System.out.print("请输入实验室位置：");
        String location = scanner.nextLine();
        System.out.print("请输入实验室容量：");
        int capacity = scanner.nextInt();
        scanner.nextLine();

        Lab lab = new Lab();
        lab.setLabId(labId);
        lab.setLabNumber(labNumber);
        lab.setLabName(labName);
        lab.setLocation(location);
        lab.setCapacity(capacity);
        lab.setStatus("available");

        if (labDAO.addLab(lab)) {
            System.out.println("实验室添加成功");
        } else {
            System.out.println("实验室添加失败");
        }
    }

    // 删除实验室
    private void deleteLab() {
        System.out.print("请输入要删除的实验室ID：");
        int labId = scanner.nextInt();
        scanner.nextLine();

        if (labDAO.deleteLab(labId)) {
            System.out.println("实验室删除成功");
        } else {
            System.out.println("实验室删除失败（ID不存在）");
        }
    }

    // 修改实验室信息
    private void updateLab() {
        System.out.print("请输入要修改的实验室ID：");
        int labId = scanner.nextInt();
        scanner.nextLine();

        Lab lab = labDAO.getLabById(labId);
        if (lab == null) {
            System.out.println("实验室不存在");
            return;
        }

        System.out.print("请输入新实验室编号（原：" + lab.getLabNumber() + "）：");
        String labNumber = scanner.nextLine();
        System.out.print("请输入新实验室名称（原：" + lab.getLabName() + "）：");
        String labName = scanner.nextLine();
        System.out.print("请输入新实验室位置（原：" + lab.getLocation() + "）：");
        String location = scanner.nextLine();
        System.out.print("请输入新实验室容量（原：" + lab.getCapacity() + "）：");
        int capacity = scanner.nextInt();
        scanner.nextLine();

        lab.setLabNumber(labNumber);
        lab.setLabName(labName);
        lab.setLocation(location);
        lab.setCapacity(capacity);

        if (labDAO.updateLab(lab)) {
            System.out.println("实验室信息修改成功");
        } else {
            System.out.println("实验室信息修改失败");
        }
    }

    // 查看实验室列表
    private void listLabs() {
        System.out.println("\n=== 实验室列表 ===");
        labDAO.listAllLabs().forEach(lab ->
                System.out.printf("ID: %d, 编号: %s, 名称: %s, 位置: %s, 状态: %s, 容量: %d\n",
                        lab.getLabId(), lab.getLabNumber(), lab.getLabName(), lab.getLocation(), lab.getStatus(), lab.getCapacity())
        );
    }

    // 查看实验室使用情况
    private void showLabUsage() {
        System.out.println("\n=== 实验室使用情况 ===");
        labDAO.listAllLabs().forEach(lab -> {
            System.out.printf("实验室ID: %d, 名称: %s, 总预约次数: %d\n",
                    lab.getLabId(), lab.getLabName(), reservationDAO.getReservationsByLab(lab.getLabId()).size());
            System.out.println("详细预约记录:");
            reservationDAO.getReservationsByLab(lab.getLabId()).forEach(res -> {
                User user = userDAO.getUserById(res.getUserId());
                System.out.printf("  预约人: %s（ID: %d）, 时间: %s - %s, 用途: %s\n",
                        user.getRealName(), user.getUserId(),
                        sdf.format(res.getStartTime()), sdf.format(res.getEndTime()),
                        res.getPurpose() == null ? "无" : res.getPurpose());
            });
            System.out.println("-------------------");
        });
    }
}
